package com.hsgene.authority.persistence;

import com.hsgene.authority.constants.AccountPermissionCondition;
import com.hsgene.authority.domain.GeneticTestingOperationAccountPermission;
import com.hsgene.authority.domain.GeneticTestingOperationPermission;
import com.hsgene.authority.dto.OperationAccountPermissionDetailDto;
import com.hsgene.authority.dto.OperationAccountPermissionDto;
import com.hsgene.common.util.support.LimitHelper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * 权限Repository
 *
 * @author wangbing
 * @version 1.0, 2018/11/5
 */
@Repository
public interface PermissionRepository {

    /**
     * 根据id查询权限信息
     *
     * @param id 权限id
     * @return 权限信息
     */
    GeneticTestingOperationPermission findById(@Param("id") String id);

    /**
     * 根据父级id和位置，定位查找权限
     *
     * @param parentId 父级权限id
     * @param position 当前位置
     * @return 权限信息
     */
    GeneticTestingOperationPermission findByPosition(
            @Param("parentId") String parentId, @Param("position") Integer position);

    /**
     * 根据子权限名称，查询是否有此权限
     *
     * @param parentId       父级id
     * @param permissionName 子权限名称
     * @return 子权限信息
     */
    GeneticTestingOperationPermission findByChildName(
            @Param("parentId") String parentId, @Param("permissionName") String permissionName);

    /**
     * 查询子权限列表
     *
     * @param parentId 父级id
     * @return 子权限列表
     */
    List<GeneticTestingOperationPermission> findByParentId(@Param("parentId") String parentId);

    /**
     * 保存权限信息
     *
     * @param permission 权限信息
     */
    void save(@Param("permission") GeneticTestingOperationPermission permission);

    /**
     * 更新权限信息
     *
     * @param permission 权限信息
     */
    void update(@Param("permission") GeneticTestingOperationPermission permission);

    /**
     * 删除指定权限信息
     *
     * @param permissionId 权限id
     */
    void delete(@Param("permissionId") String permissionId);

    /**
     * 获取所有可用的权限配置
     *
     * @return 权限配置
     */
    List<GeneticTestingOperationPermission> getAllAvailablePermission();

    /**
     * 获取部门权限
     *
     * @param departmentId 部门id
     * @param companyId    公司id
     * @return 部门权限
     */
    List<GeneticTestingOperationAccountPermission> getDepartmentPermission(
            @Param("departmentId") String departmentId,
            @Param("companyId") String companyId);

    /**
     * 查询权限的使用信息
     *
     * @param permissionId 权限id
     * @return 权限的使用信息
     */
    List<GeneticTestingOperationAccountPermission> queryPermissionUsed(
            @Param("permissionId") String permissionId);

    /**
     * 批量保存权限关联信息
     *
     * @param accountPermissions 权限关联信息
     */
    void saveAllAccountPermissions(@Param("accountPermissions") List<GeneticTestingOperationAccountPermission> accountPermissions);

    /**
     * 清除部门所有权限
     *
     * @param departmentId 部门id
     */
    void clearAllAccountPermissions(@Param("departmentId") String departmentId);

    /**
     * 查询符合条件的数量
     *
     * @param condition 查询条件
     * @return 数量
     */
    int queryAccountPermissionCount(@Param("condition") AccountPermissionCondition condition);

    /**
     * 查询符合条件的部门权限信息
     *
     * @param condition   查询条件
     * @param limitHelper 分页参数
     * @return 部门权限信息列表
     */
    List<OperationAccountPermissionDto> queryAccountPermissions(
            @Param("condition") AccountPermissionCondition condition,
            @Param("limitHelper") LimitHelper limitHelper);

    /**
     * 查询所有部门权限信息
     *
     * @param departmentId 部门id
     * @return 部门权限信息
     */
    List<OperationAccountPermissionDetailDto> queryDepartmentPermission(@Param("departmentId") String departmentId);
}
